import Vue, { ComponentOptions, AsyncComponent } from 'vue'

type Component = ComponentOptions<Vue> | typeof Vue | AsyncComponent

/**
 * 组件模型（CM）
 * @attribute id: string 组件 ID [可空]
 * @attribute tag: string 组件标签 [可空]
 * @attribute component: Component 组件 [可空]
 * @attribute name: string 属性（用于绑定 model） [可空]
 * @attribute text: string 文本（直接输出到节点间） [可空]
 * @attribute html: string html（直接输出到节点间） [可空]
 * @attribute props: Map<string, any> 既 Vue 中的 $attrs（可通过 v-bind 进行绑定） [可空]
 * @attribute events: Map<string, Function | Function[]> 既 Vue 中的 $listeners（可通过 v-on 进行绑定） [可空]
 * @attribute items: ComponentModel[] 下级组件模型集 [可空]
 * @attribute meta: any 扩展元信息 [可空]
 */
export interface ComponentModel {
  id?: string
  tag?: string
  component?: Component
  name?: string
  text?: string
  html?: string
  props?: Map<string, any>
  events?: Map<string, Function | Function[]>
  items?: ComponentModel[]
  meta?: any
}

/**
 * Web 响应对象
 * @attribute code: number 响应码
 * @attribute messages: string | string[] 消息集 [可空]
 * @attribute responseBody: any 响应主体 [可空]
 */
export interface WebResponse {
  code: number
  messages?: string | string[]
  responseBody?: any
}
